#include "widget.h"
#include "TAsync/TTaskQueue.h"

#include <QtConcurrent>
#include <QThreadPool>
#include <QThread>
#include <QDebug>

#include <functional>
#include <iostream>

void back_ground_task_test()
{
    TTask task = std::bind([](){
        qDebug() << "background task" << 1 + 1;
    });
    TTaskQueue::get().queueBackgroundTask(task);

}

void single_timer_test()
{
    TTask time = std::bind([](){
        qDebug() << "single timeout" << QTime::currentTime();
    });
    qDebug() << "run:" << QTime::currentTime();
    TTaskQueue::get().queueTimerTask(time,1000,false);

}

void repeat_timer_test()
{
    TTask time = std::bind([](){
        qDebug() << "repeate timeout" << QTime::currentTime();
    });
    qDebug() << "run:" << QTime::currentTime();
    auto timer = TTaskQueue::get().queueTimerTask(time,1000,true);
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    TTaskQueue::get();

    /* GUI更新测试：非UI线程，同步调用GUI更新任务，普通成员函数 */
    QtConcurrent::run(QThreadPool::globalInstance(),[this](){
        QThread::sleep(3);
        TTask task = std::bind((void (Widget::*)(int, int))&Widget::resize,this,100,10);
        TTaskQueue::get().queueGuiTask(task,true);
    });

    /* GUI更新测试：非UI线程，异步调用GUI更新任务，普通成员函数 */
    QtConcurrent::run(QThreadPool::globalInstance(),[this](){
        QThread::sleep(5);
        TTask task = std::bind((void (Widget::*)(int, int))&Widget::resize,this,200,200);
        TTaskQueue::get().queueGuiTask(task,true);
    });

    /*GUI线程调用：GUI线程禁止同步调用*/
    TTask asynctask = std::bind((void (Widget::*)(int, int))&Widget::resize,this,10,100);
    qDebug() << TTaskQueue::get().queueGuiTask(asynctask,false);

    single_timer_test();
    repeat_timer_test();
    back_ground_task_test();


    /* GUI更新测试：绑定重载函数 */
    TTask task = std::bind((void (Widget::*)(int, int))&Widget::resize,this,100,100);
    TTaskQueue::get().queueGuiTask(task,false);
}

Widget::~Widget()
{
}

